home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / edit / aaem95ma.zip / EM.INF < prev    next >
INI File  |  1992-10-20  |  37KB  |  681 lines

  1. [This is file \AM\EM.INF]
  2. [Information about the operators and functions in AAEMACS]
  3.  
  4. typedef unsigned char byte;
  5. '&' = '->' = 'pointer to'; '#' = number (of)
  6. All class etc members are public.
  7. These declarations apply hereinunder:- buffer Bu; line L; mark M; gp_cur G;
  8. region R; macro Ma; macstep Ms; keyarray Ka; tree T; parsing P; val K; val S;
  9. char c,*s; int i,j,k,n,d; byte b; func Kf /* key-subroutine */; screenline Sc;
  10. (and ditto with numerals after, e.g. Bu1, Bu2 are buffers)
  11.  ---------- text string
  12. [class val]
  13. TYPE    MEMBER          DESCRIPTION
  14. char*   S.s             ->text (0 if S.n==0)
  15. int     S.n             how many characters in string
  16.  
  17. TYPE    FUNCTION        DESCRIPTION
  18.         OR OPERATION
  19. char    S[i]            i'th char in string
  20. val     val(s,n)        assemble s and n into a val
  21. val     val(s)          convert char* to val: assemble s & strlen(s) into a val
  22. val     s               (i.e. a char* where a val should be)    ditto
  23. val     val()           val with text length = 0
  24. void    S=s             S.s=s; S.n=strlen(s); no string-copy
  25. void    S1=S2           copy S2.s and S2.n; no string-copy
  26. val     val(S)          how to copy a val (no string-copy)
  27. int     S==c            logical: if S.n==1 & S[0]==c
  28. int     S==s            logical: if S.n==strlen(s) & string s matches text of S
  29. void    S.newbody()     give S a new separate copy of its text string
  30. void    S.record()      append S to macro currently being recorded
  31. void    S1.getifn(S2,s) if S2 is null then S1 = string got by asking user
  32.                         with s as prompt; else S1 = S2
  33.  
  34. TYPE    GLOBAL VARIABLE   DESCRIPTION
  35. val     _       dustbin for unwanted val* & val& function arguments to point to
  36.  ---------- detached chain of lines, e.g. a kill in the kill ring
  37. [class Text]
  38. TYPE    MEMBER          DESCRIPTION
  39. line*   beg     -> start of chain of lines
  40. line*   end     -> end of chain of lines
  41.  
  42. TYPE    FUNCTION        DESCRIPTION
  43.         OR OPERATION
  44. Text    Text()          empty Text
  45. Text    Text(&L1,&L2)   set up a Text with beg=L1 and end=L2
  46. Text    Text(T)         copy T.beg & T.end, does not duplicate the lines
  47. Text    Text(S)         convert val to Text by setting up lines etc.
  48.                         Obeys linefeed etc.
  49. Text    S       (i.e. a val where a Text should be)     ditto
  50. int     T.read(s)       read file named s into a chain of lines; set T -> them
  51. void    T1=T2           copy T2's text lines; make T1 -> them
  52. void    T.clear()       make T empty
  53. void    T.print()       print text of T on the debug file
  54.  
  55. TYPE    GLOBAL VARIABLE   DESCRIPTION
  56. Text    killring[16];   kill ring
  57. short   nkill;          current place in kill ring
  58.  ---------- position on screen
  59. [class gp_cur]
  60. byte    c               column (counted from 0)
  61. byte    r               row (counted from 0)
  62.  
  63. gp_cur  gp_cur(b1,b2)   set up gp_cur as col b1, row b2
  64. gp_cur  gp_cur(b1)      set up gp_cur as col b1, row 0
  65. gp_cur  b1              ditto
  66. gp_cur  gp_cur()        set up gp_cur as col 0,  row 0
  67. gp_cur  gp_cur(G)       how to copy a gp_cur
  68. void    G1=G2           assign, i.e. copy
  69.  
  70. gp_cur  cursor;         the cursor
  71. char *Moan,*Display;    -> strings waiting to be printed at bottom of screen
  72.  ---------- a position in a file buffer
  73. [class mark]
  74. mark*   prev            -> previous mark in that buffer's mark ring
  75. mark*   next            -> next mark in that buffer's mark ring
  76. line*   r               -> line marked
  77. short   c               distance from start of line
  78.  
  79. mark    mark(&L,i)      set up a mark (.prev & .next are undefined)
  80. mark    mark()          ditto but with r=0, c=0
  81. mark    mark(M)         copy M.r and M.c only
  82. byte    charat(M)       the character that the mark points to
  83. void    M1=M2           copy M2.r and M2.c only
  84. void    M++     move mark 1 char forward  (set M.r=0 if it hits end of file)
  85. void    ++M     ditto
  86. void    M--     move mark 1 char back   (set M.r=0 if it hits start of file)
  87. void    --M     ditto
  88. void    M=c     copy c into the char that M points to
  89. void    M+=c    at mark M, insert char c
  90. void    M+=s    at mark M, insert string s
  91. void    M+=&Bu  at mark M, insert copy of text of buffer Bu
  92. line*   M/i     at mark M, split line (= insert end-of-line). Return -> line
  93.                 after this new split. If i!=0, any mark at the split point goes
  94.                 into the new line; else it stays in the old line.
  95. void    !M      delete character that M points to
  96. void    M.bs()  backspace-delete character that M points to
  97. region  M.yank(T,0)     insert text T at mark. Return region -> inserted text.
  98. region  M.yank(T,1)     ditto but insert a copy of T
  99. void    M>>=n   at M insert n undefined chars. No check for array-out-of-bounds
  100. void    M<<=n   at M delete n chars;
  101.                 duplicate n last chars of line to keep length same.
  102. int     M.Up()                  move M up 1 line; result logical = if success
  103. int     M.Down()                move M down 1 line; result logical = if success
  104. int     M.Left()                move M left 1 line; result logical = if success
  105. int     M.Right()               move M right 1 line; result logical = if success
  106. int     M.is_white()            logical: if space or tab or end-of-line at M
  107. int     M.is_alpha()            logical: if letter at M
  108. int     M.is_alnum()            logical: if letter or digit at M
  109. void    M.find_white()          move M forwards to space or tab or end-of-line
  110. void    M.find_white(0)         ditto
  111. void    M.find_white(1)         move M backwards to space or tab or end-of-line
  112. void    M.skip_white(0,1)       move M forwards over spaces, tabs, end-of-lines
  113. void    M.skip_white(0,0)       ditto but stop at end-of-line
  114. void    M.skip_white(0)         ditto
  115. void    M.skip_white()          ditto
  116. void    M.skip_white(1,1)       move M backwards over spaces, tabs, end-of-lines
  117. void    M.skip_white(1,0)       ditto but stop at end-of-line
  118. void    M.skip_white(1)         ditto
  119. void    M.skip_alpha(-) move M over letters.          Args as M.skip_white(-)
  120. void    M.skip_alnum(-) move M over letters & digits. Args as M.skip_white(-)
  121. void    M.find_alpha(-) move M to letter.             Args as M.skip_white(-)
  122. void    M.find_alnum(-) move M to letter or number.   Args as M.skip_white(-)
  123. int     M.at_eol()      logical: if end-of-line at M
  124. void    M.skipword(n)   move M n words forwards (backwards if n<0)
  125. int     M.isin(R)       logical: if M is in region R
  126. int     M1<M2           logical: if M1 is before M2 in text order in file buffer
  127. int     M1==M2          logical: if M1 and M2 are the same
  128. int     M1!=M2          logical: if M1 and M2 are not the same
  129. void    M.push()        push copy of cursor onto top of mark stack
  130. void    M.hsup()        push copy of cursor onto bottom of mark stack
  131. void    M.pop()         take top member off mark stack & set cursor = it
  132. void    M.skipsentence(n)   move N to nth end-of-sentence forwards (back if n<0)
  133. void    M.skippara(n)   move N to nth end-of-paragraph forwards (back if n<0)
  134. byte    charat(M)       the char that M points to
  135.  ---------- a region of text in a file buffer, defined by two marks
  136. [class region]
  137. mark    R.beg           start of region R
  138. mark    B.end           end of region R
  139.  
  140. region  M1-=M2          the region between M1 and M2
  141. region  M1-M2           ditto, making sure that the region is not back-to-front
  142. region  region()        region with both bounds null
  143. region  region(M1,M2)   region with bounds M1 & M2 (no check that M1<M2)
  144. void    R1=R2           copy bounds of region
  145. mark    R.Delete()      delete text in region. Result -> join where deletion was
  146. mark    R.kill()        ditto, but put deleted matter in kill ring
  147. void    R.copykill()    put copy of region into kill ring
  148. void    R.format()      re-lineate the text in the region
  149. int     R.huntf(S)      look in R for text of S, starting at R.beg
  150. int     R.huntf(S,0)    ditto
  151. int     R.huntf(S,1)    ditto but only look for whole word == S
  152. int     R.huntb(S)      look in R for text of S, starting at R.end
  153. int     R.huntb(S,0)    ditto
  154. int     R.huntb(S,1)    ditto but only look for whole word == S
  155. int     R.hunt(S,i,n)   ditto, backwards if i!=0, whole words only if n!=0
  156. void    R.replace(S,S2,i,j)     ditto, replace text found by S2, repeat.
  157.                         If i!=0, ask each time. If j!=0, whole words only.
  158.                         Zero trailing i and j args can be omitted.
  159. region  R.moveto(M)     delete region, insert it at M. Result -> new place of R
  160. region  R.repl(T)       delete region, insert T instead. Result -> inserted T
  161. region  R.repl(T,0)     ditto
  162. region  R.repl(T,1)     ditto but take a copy of T to use instead of T itself
  163. void    R.right_order() swop the bounds of R if they are in the wrong order.
  164.                         Moan about a bug if either bound is null.
  165. void    R.color(n1,n2)  note colors for region R: foreground n1, background n2
  166. void    R.Case(0)       change all letters in region R to lowercase
  167. void    R.Case()        ditto
  168. void    R.Case(1)       change all letters in region R to uppercase
  169. int     R.ok_to_delete()        ask user if he wants region R deleted
  170. void    R.expandtabs()  expand tabs to spaces in region R
  171. void    R.maketabs()    contract spaces to tabs in region R
  172.  ------------------- a line of text in a file buffer
  173. [class line]
  174. line*           next    -> next line (0 for last line in file)
  175. line*           prev    -> previous line (0 for first line in file)
  176. short int       how many chars in line
  177. char*           s       test of line (physically has (L,n+15)&~15 bytes)
  178. char            la      logical: if line has been altered since last displayed
  179. static short int notshown       (set to 4000hex in main())
  180. short int       sl      screen line number that this line is displayed on.
  181.                         (= L.notshown if this line is not currently on screen)
  182.  
  183. void    nullline()      empty line
  184. line    line()          empty line
  185. line    line(s)         line with text specified
  186. line    s               ditto
  187. line    line(s,n)       ditto, length of text also specified
  188. void    -L              remove previous eol, i.e. chain line L to previous line
  189. void    L--             remove next eol, i.e. chain line L to next line
  190. void    --L     ditto. For this & 2 previous forms, line L must be in buffer
  191. void    L-T     ditto. Use this form if line L is in Text T instead of in buffer
  192. void    L.display(i)    display line L on screen line i
  193. int     L.dispfold(i)   display line L on screen lines i etseq, folded if long
  194. int     L.nparts()      how many screen lines needed to display line L folded
  195. int     L.nparts(-1)    ditto
  196. int     L.nparts(i)     if i>=0, how many screen lines needed to
  197.                         display the first i characters if line L folded
  198. int     L.showeol()     logical: if need to display eol character at end of L
  199. void    L1-L2           link lines L1 and L2 in that consecutive text order
  200. line*   L/S     insert new line (whose text = copy of S) after  L; result -> it
  201. line*   S/L     insert new line (whose text = copy of S) before L; result -> it
  202. void    L=s     give L new text
  203. void    L+=c    append character c to end of text of line L
  204. void    L+=L2   append copy of text of line L2 to end of text of line L
  205. void    L=i     alter L.n to i, and adjust text accordingly
  206. void    L+=i    alter L.n to L.n+i, and adjust text accordingly
  207. void    L-=i    alter L.n to L.n-i, and adjust text accordingly
  208. void    L.empty()       delete text of line L
  209. int     L.to_tabexp(n)  new place # of nth char in L if tabs in L were expanded
  210. int     L.to_tabexp(n,0)        ditto
  211. int     L.to_tabexp(n,1)        ditto but 6*(counted in 'n'-widths proportional)
  212. int     L.from_tabexp(-)        reverse of L.to_tabexp(-), same args
  213. int     L.to_scrcolno(n)        convert char # to screen col #, in line L
  214. int     L.from_scrcolno(n)      convert screen col # to char #, in line L
  215. int     L.blank()               logical, if line is empty
  216. void    L.dotty()       use L.to_scrcolno(-) to check B->dot.c against B->dotcc
  217. void    L.split_if_long()       insert eol's if line L is longer than allowed
  218. void    L.de_trailing_space()   remove trailing tabs and spaces from line L
  219. int     L.is_bop()              logical: if L is first line of paragraph
  220. int     L.is_eop()              logical: if L is last line of paragraph
  221. int     L.lineno()      line number in file buffer (first line is line 0 here)
  222. void    L.del()                 delete line L
  223.  
  224. line*   dustbin         -> chain of deleted lines. They are put here, not
  225.                 free()'d at once, so pointers to them don't get to point to any
  226.                 newly created line's or strings etc causing confusion.
  227. void    emptydustbin()          empty the dustbin
  228. line* line0             dummy line
  229. line* modeline          dummy line for the modes line at the bottoms of windows
  230.  ---------- a line on the screen
  231. class screenline{public:
  232. line*           Sc.l    line in buffer that Sc is displaying
  233. line*           Sc.nl   new ditto when altering screen display
  234. int             Sc.lp   which part of folded line that Sc is displaying
  235. int             Sc.nlp  new ditto when altering screen display
  236. int             Sc.np   Not used. Was 'how many parts in folded buffer line'
  237. int             Sc.lc   how many characters on this screen line
  238. int             Sc.ok   logical: if this screen line has not been spoilt
  239. int             Sc.nc   how many characters can be displayed on this screen line
  240. unsigned short* Sc.sa   Sc.sa[i] = colors to use with i-th character of Sc
  241. buffer*         Sc.buf  which buffer Sc is displaying a line of
  242.  
  243. screenline      Sl[]    -> lines of the screen
  244.  ---------- file buffer
  245. class buffer
  246. buffer* Bu.next         -> next buffer in chain of buffers
  247. mark    Bu.start        -> char which is top left char on screen
  248. int     Bu.startc       backup for Bu.start.c
  249. int     Bu.stback       if folding long lines, where in Bu.start.r to start
  250. mark    Bu.dot          cursor. Start of Bu's chain of marks
  251. byte    Bu.row1         # of first row of screen used by buffer
  252. byte    Bu.lastrow      # of last row of screen used by buffer
  253. byte    Bu.nrows   how many rows of this buffer's text on screen incl. info line
  254. byte    Bu.ncols        how many columns of text on screen
  255. short   Bu.dotcc        screen col # of Bu.dot
  256. short   Bu.dotcc2       backup of ditto
  257. line    Bu.text         completes circle of lines of Bu's text.
  258.                         Bu.text.next -> first line, Bu.text.prev -> last line
  259. bmode   Bu.mode         editor mode of this buffer
  260. byte    Bu.truncated    logical: if file couldn't be read completely
  261. byte    Bu.invisible    logical: if this buffer is not to be displayed
  262. byte    Bu.readonly     logical: if this buffer can't be written to its file
  263. byte    Bu.changed      logical: if Bu's text changed since it was saved last
  264. byte    Bu.oldch        backup for ditto
  265. -       -               (the next 8 members are Bu's <modes>)
  266. byte    Bu.overlay      logical: if to insert or overlay chars typed in
  267. byte    Bu.tabtype      how to display tabs
  268. byte    Bu.twod         what to do when running off end of line
  269. byte    Bu.wrap         logical: if to automatically split overlong lines
  270. byte    Bu.Case         logical: if to distinguish case of letters on searching
  271. byte    Bu.longlines    logical: if to display long lines folded
  272. byte    Bu.esc_as_alt   logical: if to treat all esc-key as alt-key
  273. byte    Bu.skip_after_word      what to do between words when skipping words
  274. static int      Bu.nmodes                       how many modes (now 8)
  275. int     Bu.rmargin      right margin for auto newline mode
  276. int     Bu.sortcol      how many chars for sortlines to ignore at start of lines
  277. char*   Bu.fname        file name
  278. char*   Bu.bname        buffer name
  279.  
  280. void    Bu.initbuffer() initialize buffer Bu
  281. buffer  buffer()        initialized buffer
  282. buffer  buffer(s)       new buffer named after and read from file s
  283. buffer  s               ditto
  284. buffer  buffer(s,1)     ditto
  285. buffer  buffer(s,0)     new empty buffer named after file s
  286. line*   Bu[n]           -> nth text line of buffer Bu
  287. void    Bu.deltext()    delete all Bu's text
  288. buffer* Bu.linkin()     put Bu into buffer chain
  289. void    Bu.read()       read Bu from its file
  290. void    Bu.write()      write Bu to its file
  291. void    Bu.clearscreen()        clear Bu's screen area
  292. void    Bu.go_to()      make Bu the current buffer
  293. mark    Bu.bof()        -> start of text of Bu
  294. mark    Bu.eof()        -> end of text of Bu
  295. int     Bu.nmarks()     how many ordinary marks currently in Bu
  296. mark&   Bu.Mark(n)      (n+1)th mark. if n<0, (-n)th from bottom of stack
  297. void    Bu.display()    redisplay altered lines of Bu's screen area
  298. void    Bu.dispfold(n)  ditto in fold-long-lines mode, omitting n screen lines
  299.                         after start of line Bu.start.r
  300. void    Bu.dispfold()   as Bu.dispfold(0)
  301. void    Bu.rem1mark()   remove top mark from Bu's mark stack
  302. void    Bu.up()         move Bu.dot up one position
  303. void    Bu.down()       move Bu.dot down one position
  304. void    Bu.left()       move Bu.dot left one position
  305. void    Bu.right()      move Bu.dot right one position
  306. void    Bu.split_window_with(n) split Bu's window. Bu keeps n screen lines
  307.                         (0 = half its lines). Ask for buffer for new window
  308. void    Bu+=c           as Bu.dot+=c
  309. void    Bu+=s           as Bu.dot+=s
  310.  
  311. buffer* buf0            dummy buffer
  312. buffer* bhead           start of chain of buffers
  313. buffer* B       -> current buffer. Lines worked on <must> be in this buffer
  314. int     bcount          how many buffers defined
  315. line    *T              entry point of circle of lines currently being handled
  316. Buffer has extra final empty line unless last char in file is not end-of-line
  317.  ---------- some global variables
  318. char    DIR[]   name of current DOS directory
  319. #define HELPFILE "HELP"
  320. #define BIGHELPFILE "HELP.BIG"
  321. char    helpfile[],bighelpfile[]        names of these two files
  322. char    T1w[],T2w[];    working space for reading 1st & 2nd subr text args
  323. val     T1t,T2t;        ditto
  324. val     specialchars;   chars with special meanings in strings in AAEMACS macro
  325.                         listings:       they are now '"' '\' '^'
  326. int     needswrap       work space in auto line feed mode
  327. int     regfcol         foreground color for region to be specially colored
  328. int     regbcol         background color for region to be specially colored
  329. int     play            logical: if obeying a macro
  330. int     obtype          logical: if killing or yanking or neither:-
  331.                         enum {ob_kill=1,ob_yank=2,ob_other=3};
  332. int     prevobtype      previous value of ditto
  333. region  lastyank        -> last text yanked
  334. region  colreg          -> special color region
  335. buffer* colbuf          which buffer colreg points to text of
  336. buffer* window[]        which buffer is in each screen window
  337. int     nwindows;       how many windows
  338. int     currentwindow;
  339. long _ax,_bx,_cx,_dx,_si,_di,_bp,_es; long GP_4; short GP_2; char GP_1;
  340.         to put registers in for interrupt calls
  341. enum Color{Black=0,Blue=1,Green=2,Cyan=3,Red=4,Magenta=5,Orange=6,White=7};
  342.  ----------
  343. byte    gp_Mode                 screen VGA/etc mode
  344. byte    gp_Rows,gp_Cols         how many rows and columns of chars on screen
  345. short   gp_Attr,gp_Attr_def     text colors to use
  346. unsigned short  sch(byte C,byte A){return C|(A<<8);}
  347.                 assemble char and its color info for screen position
  348. #define screen ((unsigned short*)0xe01b8000)            Gnu C address of screen
  349. #define scr(row,col) (screen[(col)+(row)*gp_Cols])      a char on the screen
  350. byte    getkey()        read a key (for special key call twice,gets 0 then char)
  351. int     doschar()       ditto?
  352. int     typahead()      logical: if a char is waiting to be read
  353. int     beep()          the terminal beeps
  354. int     gp_mode()       current screen (VGA/etc) mode
  355. void    gp_mode(c)      set screen (VGA/etc) mode
  356. void    gp_cursor(G)    move cursor to G
  357. void    gp_cursor(i,n)  move cursor to screen line i, screen col (count from 0)
  358. gp_cur  gp_cursor()     current cursor position
  359. void    gp_clear()      clear screen line 0
  360. void    gp_clear(i)     clear screen line i
  361. void    gp_clear(i,j)   clear screen line i, cols k to end
  362. void    gp_clear(i,j,k) clear screen line i, cols j to k
  363. short   Attrib(i,j)     char color byte: foreground color i, background color j.
  364.                         i & j 0 to 7; i+8 for bright, j+8 for flashing
  365. short   Attrib(i,j,0)   ditto
  366. short   Attrib(i,j,1)   ditto but flashing
  367.  ----------
  368. Codes of special keys. Some of these may be different on different PC's:-
  369. enum {alt_sharp=43, alt_apostr=40, alt_comma=51, alt_minus=130, alt_fullstop=5,
  370. alt_slash=53, alt_0=129, alt_1=120, alt_2=121, alt_3=122, alt_4=123, alt_5=124,
  371. alt_6=125, alt_7=126, alt_8=127, alt_9=128, alt_semicolon=39, alt_equals=131,
  372. alt_A=30, alt_B=48, alt_C=46, alt_D=32, alt_E=18, alt_F=33, alt_G=34, alt_H=35,
  373. alt_I=23, alt_J=36, alt_K=37, alt_L=38, alt_M=50, alt_N=49, alt_O=24, alt_P=25,
  374. alt_Q=16, alt_R=19, alt_S=31, alt_T=20, alt_U=22, alt_V=47, alt_W=17, alt_X=45,
  375. alt_Y=21, alt_Z=44, alt_leftsq=26, alt_rightsq=27, alt_grave=41, ctrl_2=3,
  376. alt_bksp=14, alt_esc=1, alt_ret=28, sh_tab=15, alt_tab=165, ctrl_tab=148,
  377. del=83, alt_del=163, ctrl_del=147, end=79, alt_end=159, ctrl_end=117, home=71,
  378. alt_home=151, ctrl_home=119, insert=82, alt_insert=162, ctrl_insert=146,
  379. pagedown=81, alt_pagedown=161, ctrl_pagedown=118, pageup=73, alt_pageup=153,
  380. ctrl_pageup=132, downarrow=80, leftarrow=75, rightarrow=77, uparrow=72,
  381. alt_downarrow=160, alt_leftarrow=155, alt_rightarrow=157, alt_uparrow=152,
  382. ctrl_downarrow=145, ctrl_leftarrow=115, ctrl_rightarrow=116, ctrl_uparrow=141,
  383. f1=59, f2=60, f3=61, f4=62, f5=63, f6=64, f7=65, f8=66, f9=67, f10=68, f11=133,
  384. f12=134, sh_f1=84, sh_f2=85, sh_f3=86, sh_f4=87, sh_f5=88, sh_f6=89, sh_f7=90,
  385. sh_f8=91, sh_f9=92, sh_f10=93, sh_f11=135, sh_f12=136, ctrl_f1=94, ctrl_f2=95,
  386. ctrl_f3=96, ctrl_f4=97, ctrl_f5=98, ctrl_f6=99, ctrl_f7=100, ctrl_f8=101,
  387. ctrl_f9=102, ctrl_f10=103, ctrl_f11=137, ctrl_f12=138, alt_f1=104, alt_f2=105,
  388. alt_f3=106, alt_f4=107, alt_f5=108, alt_f6=109, alt_f7=110, alt_f8=111,
  389. alt_f9=112, alt_f10=113, alt_f11=139, alt_f12=140};
  390.  ----------
  391. char *altnames[256],*altshortnames[256]; val keynames[];
  392.                 arrays to read key names into from file INFO.DAT
  393.  ----------
  394. void    showmoan()      display any awaiting moans and displays
  395. void    MOAN(s)         set awaiting moan to s
  396. char*   fullfilename(s1,s2)     in string s1 put full pathname of file s2;
  397.                                 replace / by \    return s1 as function value
  398. char*   newstr(s)       new string which is a copy of s
  399.  ----------
  400. int     bytes(s)        4 bytes starting at address s, treated as an int
  401. int     roundup(i)      i rounded up to multiple of 16
  402. char*   copytext(s1,s2,n)       copy n chars from s2 etseq to s1 etseq; do not
  403.                                 stop at zero chars; return s1 as function value
  404. int     comptext(s1,s2,n)       like strncmp but do not stop at zero chars
  405. int     comptext(s1,s2,n,0)     ditto
  406. int     comptext(s1,s2,n,1)     ditto but ignore case of letters
  407.  ----------
  408. #define add_to_list(head,item) ((item)->next=(head), (head)=(item))
  409. #define remove_from_list(head,item) ({typeof(item) *I; \
  410.     for(I=&(head);*I;I=&((*I)->next)) if(*I==(item)) {*I=(*I)->next; break;}})
  411.  ----------
  412. /**** make fault remarks without mallocking, in case fault was 'out of store' */
  413.  ----------
  414. void    recolor(i,j,k)  color of jth char of ith screen line to k
  415. int     displayn(S,n,k,i,j)
  416. int     displayn(s,n,k,i,j)
  417. void    display(S,n,k,i,j)
  418. void    display(s,n,k,i,j)
  419.                 In these last 4 lines. j=Black if omitted, i=White if omitted;
  420.                 display s or S on screen line n (displayn = do not clear to end
  421.                 of line) with foreground color i, background color j
  422. void clearscreen()              clear the screen
  423. void    ask(s1,s2,0)            ask question s1, get reply in string s2
  424. void    ask(s1,s2,1)            moan "illegal reply" then ask question as ditto
  425. void    getstring(s,i,S,n)      on screen line i ask question s and get reply
  426.                                 in S, maximum length n. Various facilities:-
  427.                 end (at start) = go to end & keep old reply; altY = insert last
  428.                 kill; altB = expect keysequence bound to buffer; del = delete;
  429.                 altdel = backspace-delete; left & right arrows = move cursor;
  430.                 home & end = go to start & end; altend = abort calling command;
  431.                 other special key = normal exit
  432.  ----------
  433. char chwidth[256];      proportionate char width for Epson printer
  434. byte to__upper[256],to__lower[256];     for char case conversion
  435. char chtype[256]; enum{c_alpha=1,c_alnum=2,c_white=4};  re char type
  436.  ----------
  437. #define to_upper(c) to__upper[(byte)(c)]
  438. #define to_lower(c) to__lower[(byte)(c)]
  439. /*----- x==y ignoring case? */
  440. #define cheq(x,y,Case) (Case?((x)==(y)):to_upper(x)==to_upper(y))
  441. #define iswhite(c) (chtype[(byte)(c)]&c_white)
  442. #define isalpha(c) (chtype[(byte)(c)]&c_alpha)
  443. #define isalnum(c) (chtype[(byte)(c)]&c_alnum)
  444.  ----------
  445. region Found;   -> text region found by various routines
  446.  ----------
  447. char*   keyname(c)      -> name of char c (copy at once the string pointed to!)
  448. char*   keyname(c,0)    ditto
  449. char*   keyname(c,1)    -> name of special char c
  450. void    Obey()          get a keyboard key sequence and obey it
  451. void    Obey(n,0)       ditto, ignore n
  452. void    Obey(n,1)       ditto, but obey it with numeric argument n
  453. void    Obey(n,i,-1)    as obey(n,i)
  454. void    Obey(n,i,j)     ditto but take j as first key in sequence
  455. void    Obey(n,i,j,-1)  ditto
  456. void    Obey(n,i,j,k)   ditto but take j & k as first two keys in sequence
  457. int     yesno(s,i)      on screen line i ask yes/no question s.
  458.                         (on last line if i == -1 or omitted)
  459.  ---------- key-subroutines and standard header for them
  460. typedef void func(val,val,val);
  461. #define Kf(name) void name(val N=val(1,0),int D=0,val T1=_,val T2=_)
  462. #define KF(name) void name(val N=val(1,0),int D=0,val T1=_,val T2=_)
  463.  ----------
  464. char*   chname(c)       -> string = name of character c
  465. void    instring(&B,S)  insert into B, quoted string = name of keysequence S
  466.  ---------- entry in table of names of AAEMACS subroutines
  467. typedef struct{func *f; key bound to subroutine
  468.         int n;          0
  469.         char*name;      string = name of subroutine
  470.         } Subr;
  471.  ---------- a value and its type, incl. information re what a key is bound to
  472. [class val] (also see above)
  473.   n (byres 0-3) value (bytes 4-7)
  474. >0              char*s          -> a string of n chars
  475.   0  unbound    char*s          if s==0 or 1, nothing, else empty string
  476.  -1  _subr      subr*f          -> a function void ....(val,val,val)
  477.  -2  _macro     macro*m         -> a macro
  478.  -3  _char      int i           the char i. 256-511 mean 'alt/special key i&255'
  479.  -4  _keyarray  keyarray*k      -> an array of val's corresponding to key values
  480.  -5  _buffer    buffer*b        -> a buffer
  481.  -6  _int       int i           the integer i
  482.  -7  _keyseq    char*s          -> a keysequence,kept in chars s[1] to s[s[0]-1]
  483.  -8  _rsvword   int i           the i'th reserved_word
  484.  -9  _unidfname char*s          -> an unidentified word (terminated by '\000')
  485. -10  _call      struct call_*C  -> base & args of a function call
  486. -11  _bad       char*s          -> a string describing what was wrong
  487. -12  _Subr      Subr*S          -> an entry in the table of subr names & info
  488. -13  _func      func*fn         -> a function val ....(int,val*)
  489. -14  _Func      Func*Fn         -> an enter in the table of func names & info
  490.  
  491. val     val()           unbound key
  492. val     val(s,n)        key-info bound to string s of n characters
  493. val     val(s)  ditto, length = strlen(s)
  494. val     s               ditto
  495. void    K=S             bind K to text of S
  496. val     val(S)  key-info bound to string = text of S
  497. val     S               ditto
  498. void    K=Kf            bind K to key-subroutine Kf
  499. val     val(Kf) key-info bound to key-subroutine Kf
  500. (etc, see in file EM.H)
  501. void    K(i,n,S1,S2)    if K is bound to a key subroutine, call it with these
  502.                         arguments. Arguments S1 and S2 can be omitted.
  503. void    K.newbody()     give K a new copy of whatever it is pointing to
  504. void    K.expandkeyseq(s) If K is bound to string which is a valid key sequence,
  505.                         make in s etseq a description of it for macro printout
  506. void    K.expandkeyseq(s,0)     ditto
  507. void    K.expandkeyseq(s,1)     ditto, short version
  508. int     K==c            1 if K is bound to a char and that char is c, else 0
  509. val&    K.keyseq()      If K is bound to string which is a valid key sequence,
  510.                         value = the key information for the key described by K
  511.  ----------
  512. typedef struct call_{int n; val arg[1];} call;
  513. Set up by malloc() to actually have n elements in arg[]. Analysis tree fork in
  514. parsing macros. arg[0] = call base, arg[1 etc) are its arguments if any.
  515.  ---------- array of 256 key bindings to look up in
  516. [class keyarray]
  517. val*    a;      array of val's
  518. short   n;      actual length of a
  519.                 (out of bounds access causes 'a' to be lengthened as needed)
  520.  
  521. void            Ka.subarray()   make Ka empty
  522. keyarray        keyarray()      empty keyarray
  523. val&            Ka[i]           i'th element of Ka
  524. void            Ka.print(n,i)   insert into current buffer a listing of the key
  525.                                 bindings in Ka. n and i control the listing.
  526.  
  527. keyarray keys;  head of lookup tree of key bindings
  528. val key0;
  529.  ----------- one statement in a macro
  530. [class macstep]
  531. val     N       numeric argument of macro step, if any
  532. val     f       keyfunction or macro to be called by this macro step
  533. val     T1      1st string or keysequence arg of macro step (if any)
  534. val     T2      2nd string or keysequence arg of macro step (if any)
  535. macstep*next    next step in this macro (=0 in last step)
  536.  
  537. enum {_insert=0,_overlay=1,_nomove=2,_arg=3,_keyseq=4};
  538. macstep macstep(K)      append to current macro a step calling key K with no
  539.                         integer argument; returns that macstep
  540. macstep K               ditto
  541. macstep macstep(K,0)    ditto
  542. macstep macstep(K,0,0)  ditto
  543. macstep macstep(K,n,1)  ditto but with integer argument = n
  544. void    Ms1=Ms2         copy macstep but do not copy Ms2.next
  545. macstep macstep(Ms)     Ms copied, but Ms.next is not copied
  546. void    Ms.expandkeyseq(s,n)    Ms must be a keyseq; insert into buffer that
  547.                         keyseq expanded into names of keys. n controls how.
  548. void    Ms()            obey the macstep. Complains if recursion goes >16 deep.
  549. void    Ms(n)           ditto. n counts the recursion depth
  550. int     Ms.print()      print Ms into buffer as macro printout
  551.  ----------- macro header
  552. [class macro]
  553. macstep*        last    -> last step in this macro
  554. macstep*        prevlast -> step that was last before last step was added
  555. macstep*        text    -> first step in this macro
  556. macstep*        name    Ma.name.f is bound to a string = name of macro
  557. char bound      logical = if this macro is bound to a key
  558.  
  559. macro   macro()         an empty macro
  560. void    Ma+=Ms          append macstep to macro
  561. void    Ma+=S           append S to macro as text argument
  562. void    Ma()            obey macro
  563. void    Ma(n,1)         obey macro with numeric argument n
  564. void    Ma(n,i,j)       obey macro: j counts recursion depth
  565. void    Ma--            remove from macro the step(s) after Ma.prevlast
  566. void    Ma.print()      print macro in buffer as macro printout
  567. void    Ma.print(s)     ditto, with macro name printed as s
  568. void    Ma.tidy()       e.g. chain up successive insert-a-character's
  569. void    Ma.empty()      make Ma empty
  570.  ----------
  571. func*keep[23];
  572. macro lastobey,*record,*Macro;
  573. macstep**laststep,**prevstep;
  574. char keychar,keyseqc[64],repeating;
  575. macstep keyseq; /* work space */
  576.  ----------
  577. void    Insert(n,i,c)   if n>0, insert char c into buffer n times. Ignores i.
  578. void    Replace(n,i,S1,S2,s,j,k)        replace T1 by t2 in region. n & i say
  579.                 which mark defines region. s is prompting string.
  580.                 Ask user each time if j!=0. Whole words only if k!=0
  581. void    search(n,i,S,s,j,k)     search in buffer for S. In region defined by
  582.                 mark n of i!=0. s is prompt string. backward search if j!=0.
  583.                 Whole words only if k!=0
  584. void    incrsearch(n,i,s,j)
  585.                 ditto, but incremental search as search string is typed in
  586. void    readescno(i)    read integer arg as esc-&-digits, using i as first digit
  587. void    readaltno(i)    read integer arg as alt-digits, using i as first digit
  588. char&   bufmode(int i,Bu)       the field of Bu that holds its ith mode
  589. char&   bufmode(i)              ditto, for the current buffer
  590.  ----------
  591. char**dispmode[];
  592.  ----------
  593. void ordinarykey(int N,int D,byte c,int rec=1);
  594.         insert or overlay character as buffer mode
  595. val&getkeyseq(char*P,char c=-1);        read key sequence from keyboard
  596. void recordkey();
  597. void forallkeys(void subr(val*),int L=0,keyarray&K=keys);
  598. void moan_if_no_help(val*f);
  599. void print_if_macro(val*f);
  600. void print_if_buffer(val*f);
  601. void print_keyf(val*f);
  602. func*namedsubr(val name);
  603. val*getk(val arg,char*prompt=0);        read bindable key sequence from keyboard
  604.  ----------
  605. char Filename[256];
  606. val Fn;
  607. buffer *foundbuffer;
  608. char *sortname[];
  609.  ---------- parsing tree for macro line read in as text
  610. [class tree]
  611. int     sort    one of:-
  612.         enum{_bad=0,_elem=1,_call=2,_special=3,_idle=4,_unidfname=5,_oddment=6};
  613. val     value   value (if it can be found) of expression parsed as tree
  614. int     n       how many arguments
  615. tree**  arg     -> array of pointers to arguments (arg 0 = call base)
  616.  
  617. void    T1=T2           copy fields
  618. tree    tree(i,n)       tree header, sort i, n args
  619. tree    tree(i)         tree header, sort i, 0 args
  620. tree    i               ditto
  621. tree    tree()          tree header, sort '_bad', 0 args
  622. tree    tree(i,K)       tree header, type i, 0 args, value=K
  623. tree    tree(i,L,j,k)   tree header, value=null, n=k-j, type i,
  624.                         arg -> jth character of L
  625. void    S=T             S = T.value, which should hold a string
  626. val*    T.inkeyseq()    read a keysequence printout
  627. val     T.raw()         convert T to string if it is string or unidentified name
  628. int     T==s            logical: if T is string or unidentified name which = s
  629. tree    T[i]            ith argument of T
  630.  ---------- pointer to buffer text being parsed by read-a-macro */
  631. [class mark]    (see above, and:-)
  632. line*   r               -> line being parsed
  633. int     c               which character in L the parsing pointer is at
  634. int     P.eol()         logical: is P at end of line?
  635. byte    P.ch()          char at pointer (ctrl-M if at end of line)
  636. int     P.is_white()    logical: if P is at space or tabulate char
  637. void    P.skipwhite()   jump P over spaces and/or tabs
  638. int     P.thisch(c)     skipwhite. Skip next char if it is c. Report next char
  639. tree*   P.elem()        look for an element, move P over text parsed
  640. tree*   P.expr()        look for an expression, move P over text parsed
  641. tree*   P.call()        look for an call, move P over text parsed
  642. tree*   P.parse()       parse P's current line
  643.  ----------
  644. void    translate(&Bu)  Bu should contain macro printout: read in the macros
  645.                         and obey any lines starting '#'
  646. int     buf_named(S)    logical: is there a buffer named S?
  647. int     findbuf(S)      if there is buffer named S, go to that buffer & return 0
  648.                         else make new buffer named S & go to it & return 1
  649. int     findbuf_new(S,0)        ditto, but use expansion of S to a full pathname
  650. int     findbuf_new(S,1)        ditto, and read file S into buffer named S
  651. int     findbuf_new(S)          ditto
  652. region  thisword()      2 marks delimiting word at cursor in current buffer
  653. region  thisword(n)     2 marks delimiting n words in current cursor starting
  654.                         (ending if n<0) with word at cursor
  655. region  thispara()      2 marks delimiting paragraph at cursor in current buffer
  656. void    casechange(1,L,i,j)   change letters in chars i to j-1 of L to uppercase
  657. void    casechange(0,L,i,j)   change letters in chars i to j-1 of L to lowercase
  658.  ----------
  659. val eosentchars; /* characters that can mark end of sentence */
  660.  ----------
  661. #define _(name) {&name,#name}
  662. Subr subrname[];
  663.  ----------
  664. (The key functions are declared in MAIN.CC and EM.H)
  665.  ----------
  666. void start_an_arg();
  667. val&getkeyseq(val P,char c=-1);
  668. void recordkeyseq(val &T);
  669. void getstring(char*pt,int Sl,val &T,int max);
  670.  ----------
  671. byte esc_alt[26];
  672. enum{esc='['-64};
  673.  ----------
  674. void out_of_store();
  675. void showmoan();
  676. int fileexists(char*);
  677.  ----------
  678. #define totab(i) (((i)|7)+1) /* next tab position after i */
  679. #define sptotab(i) (7-((i)&7))
  680.     /* how many spaces (not inclusive) from i to next tab position after i */
  681.